def logits_to_span_list_with_mark(gs, gt, token2word_idx: list, max_num=1, k_top=3, gamma=5, w=0.5, gamma2=5):
    # gs 和 gt 都是 (batch_size, sentence_seq_len) 由于在 dev 和 test 当中，batch_size 是 1，传入的时候执行了 squeeze()，所以实际 shape=(sentence_seq_len,)
    R, U, res = [], [], []
    R2, U2, res2 = [], [], []
    k_top = min(k_top, gs[:-1].size(0))  # 去掉最后一个编码的 102, 这里 debug 发现拿到的第一个 gs 的 shape 是 (18,)，因此这个 M 不会超过 3
    gs_topk_values, gs_topk_index = gs[:-1].topk(k_top, dim=0)  # topk 类似于多个元素的 argmax；
    gt_topk_values, gt_topk_index = gt[:-1].topk(k_top, dim=0)

    for i in gs_topk_index:  # 最多遍历三遍
        for j in gt_topk_index:  # 最多遍历三遍
            aspect_opinion_score = gs[i].item() + gt[j].item()
            if i <= j and aspect_opinion_score > gamma:
                # 如果 ① start 也就是 i 在 end 也就是 j 之前 ② 这个 i 和 j 的概率预测值大于某个值（默认是 5）
                opinion_aspect_distance = token2word_idx[j] - token2word_idx[i] + 1
                ul = aspect_opinion_score - w * opinion_aspect_distance  # 这个 w 默认是 0.5
                rl = (i.item(), j.item())  # ul 就是 (i, j)
                U.append(ul)  # U 中保存的是 distance 的运算结果
                R.append(rl)  # R 中保存的是 (i, j) 对应的信息
                pass
            pass
        pass

    # 筛选出前 K 个（按照评分）相互不冲突的索引序列放到 O 中；
    while len(R) != 0 and len(res) < max_num:  # 这里的 K 在计算 a_span 的时候是 1，在计算 o_span 的时候是 3
        idx = U.index(max(U))  # U 保存的是 distance 的运算结果
        l, r = R[idx][0], R[idx][1]  # R 保存的是一个一个的元组就是上边这一步的 (i, j)
        res.append(R[idx])
        R.pop(idx)
        U.pop(idx)
        R_, U_ = [], []
        for k in range(len(R)):  # 这一步的作用是删掉和
            if R[k][1] < l - 1 or R[k][0] > r + 1:
                R_.append(R[k])
                U_.append(U[k])
                pass
            pass
        R, U = R_, U_
        pass

    # 如果没有找到，上边的逻辑就直接改为这里的 w * (j - i + 1) 并且 gamma 也改成了 gamma2
    if len(res) == 0:
        for i in gs_topk_index:
            for j in gt_topk_index:
                if i <= j and gs[i].item() + gt[j].item() > gamma2:
                    ul2 = gs[i].item() + gt[j].item() - w * (j - i + 1)
                    rl2 = (i.item(), j.item())
                    U2.append(ul2)
                    R2.append(rl2)
                    pass
                pass
            pass
        if len(R2) != 0:
            idx = U2.index(max(U2))
            res.append(R2[idx])
            pass
        pass

    return res


def merge_two_scored_triplet(list1: list, list2: list) -> list:
    res = []
    average_aspect_score = (sum([v[0][2] for v in list1]) + sum(v[0][2] for v in list1)) / (len(list1) + len(list2))
    opinion_score_sum = sum([sum([e[2] for e in v[1]]) for v in list1]) + sum([sum([e[2] for e in v[1]]) for v in list2])
    opinion_n = sum(len(v[1]) for v in list1) + sum(len(v[1]) for v in list2)
    average_opinion_score = opinion_score_sum / opinion_n
    scored_aspect_span_dict = dict()
    for tmp_list in [list1, list2]:
        for scored_aspect_span, scored_opinion_span_list, s in tmp_list:
            if scored_aspect_span_dict.__contains__([scored_aspect_span[0], scored_aspect_span[1]]):
                pass
            pass
        pass
    return res
    pass
